package 线程同步.方式一_同步代码块;

public class Test {
    public static void main(String[] args) {
        // 同步代码块
        // 作用: 把访问共享资源的核心代码给上锁, 以此保证线程安全.
//        synchronized(同步锁) {
//            访问共享资源的核心代码
//        }
        // 原理: 每次只允许一个线程加锁后进入, 执行完毕后自动解锁, 其他线程才可以进来执行
        // 同步锁的注意事项:
        // 1. 对于当前同时执行的线程来说, 同步锁必须是同一把(同一个对象), 否则会出bug


        // 这里把取钱的案例移过来
        // 1:
        Account acc = new Account("123",100000);

        // 2:
        new Draw(acc,"小明").start(); // 小明
        new Draw(acc,"小红").start(); // 小红

        // 总结:
        // 1. 锁对象随便选择一个唯一的对象好不好?
        //    不好, 会影响其他无关线程的执行
        // 2. 锁对象的使用规范
        //    建议使用共享资源作为锁对象, 对于实例方法建议使用this作为锁对象
        //    对于静态方法建议使用字节码(类名.class)对象作为锁对象.
    }
}
